``` #include <sys/ptrace.h> #include <sys/wait.h> #include <stdio.h> /* 仅演示附加与脱离的API链,不含内存写入与执行流改写的完整实现 */ long r = ptrace(PTRACE_ATTACH, target_pid, 0, 0); /* rax=101,请求附加,内核先做权限检查 */ if (r < 0) { perror("PTRACE_ATTACH"); return 1; } waitpid(target_pid, NULL, 0); /* 等待目标进入停止状态,wait4 rax=61 */ ptrace(PTRACE_DETACH, target_pid, 0, 0); /* 脱离并放行目标 */ ``` 链路:`ptrace()` → glibc 置 `rax=101`,`rdi=命令`、`rsi=pid`、`rdx/r10` 为地址与数据 → 陷入后内核按命令检查凭证:`PTRACE_ATTACH` 先比对调用方与目标 UI